XY グラフ(散布図)は、変数間の関係を示すために使用されます。これまでに紹介したグラフと異なり、XY グラフでは、各ポイントに2つの数値があります。それらの値の1つを X 軸に、もう1つを Y 軸にプロットすることで、グラフは1つの変数に対するもう1つの変数の影響を示します。
前に作成した同じデータを使用して C1Chart の説明を続行しますが、今回は、2つの製品の収益の間の関係を示すXY グラフを作成します。たとえば、ウィジェットの高収益がガジェットの高収益に関係しているかどうか(製品が連動してうまく機能している可能性)や、ウィジェットの高収益がガジェットの低収益に関係しているかどうか(製品の1つを購入しているユーザーが実はその他の製品を必要としていない可能性)を確認することが必要な場合があります。
これを行うには、以前と同じ手順を実行します。主な違いは、今回、より単純な DataSeries オブジェクトではなく、XYDataSeries オブジェクトをグラフの Data.Children コレクションに追加することです。データの取得に使用される Linq ステートメントも、少し洗練され、興味深いものになっています。
このコードは、既存の系列をすべてクリアして、グラフタイプを設定します。
コードのコピー
|
|
---|---|
public Window1() { InitializeComponent(); // 現在のグラフをクリア c1Chart.Reset(true); // グラフタイプを設定 c1Chart.ChartType = ChartType.XYPlot; |
今回は XY 系列を作成するため、値の軸が2つあります(以前は、ラベルの軸と値の軸が1つずつでした)。以前行ったのと同様、タイトルと書式を両方の軸に関連付けます。スケールと注釈の書式も以前のように設定します。また、AnnoAngle プロパティを使用して X 軸の各注釈ラベルを回転させて、それらが重ならないようにします。
コードのコピー
|
|
---|---|
// 軸を取得 var yAxis = _c1Chart.View.AxisY; var xAxis = _c1Chart.View.AxisX; // Y 軸を設定 yAxis.Title = CreateTextBlock("ウィジェットの高収益", 14, FontWeights.Bold); yAxis.AnnoFormat = "#,##0 "; yAxis.AutoMin = false; yAxis.Min = 0; yAxis.MajorUnit = 2000; yAxis.AnnoAngle = 0; // X 軸を設定 xAxis.Title = CreateTextBlock("ガジェットの高収益", 14, FontWeights.Bold); xAxis.AnnoFormat = "#,##0 "; xAxis.AutoMin = false; xAxis.Min = 0; xAxis.MajorUnit = 2000; xAxis.AnnoAngle = -90; // 注釈を回転 |
今回も、前に定義した2つめのデータ提供メソッドを使用します。
コードのコピー
|
|
---|---|
// データを取得 var data = GetSalesPerMonthData(); |
次に、各日付のウィジェットとガジェットの収益合計に対応する XY のペアを取得する必要があります。Linq を使用して、この情報をデータから直接取得できます。
コードのコピー
|
|
---|---|
// 売上日付でデータをグループ化 var dataGrouped = from r in data group r by r.Date into g select new { Date = g.Key, // 日付でグループ化 Widgets = (from rp in g // ウィジェットの収益を追加 where rp.Product == "ウィジェット" select g.Sum(p => rp.Revenue)).Single(), Gadgets = (from rp in g // ガジェットの収益を追加 where rp.Product == "ガジェット" select g.Sum(p => rp.Revenue)).Single(), }; // ウィジェットの売上でデータをソート var dataSorted = from r in dataGrouped orderby r.Gadgets select r; |
1つめの Linq クエリーでは、まずデータを Date でグループ化しています。次に各グループについて、関心のある製品ごとに Date とその日付内の収益の合計を含むレコードを作成します。結果は、Date、Widgets、Gadgets の3つのプロパティを持つオブジェクトのリストです。こうしたデータのグループ化や集計は、Linq の強力な機能の1つです。 2つめの Linq クエリーは、ガジェットの収益でデータをソートするだけです。これらは X 軸上にプロットされる値であり、昇順にする必要があります。記号のみを表示した場合(ChartType = XYPlot)は、ソートされていない値をプロットしても見栄えは悪くありませんが、Line や Area といったその他のグラフタイプを選択した場合は、ソートしないと乱雑に見えます。データのグループ化、集計、およびソートが正しく完了したら、必要な作業は、データ系列を1つ作成して、1つの値セットを ValuesSource プロパティと XValuesSource プロパティに割り当てることだけです。
コードのコピー
|
|
---|---|
// 新しい XYDataSeries を作成 var ds = new XYDataSeries(); // 系列のラベル(C1ChartLegend に表示)を設定 ds.Label = "収益:\r\nウィジェット 対 ガジェット"; // Y の値を入力 ds.ValuesSource = ( from r in dataSorted select r.Widgets).ToArray(); // X の値を入力 ds.XValuesSource = ( from r in dataSorted select r.Gadgets).ToArray(); // 系列をグラフに追加 c1Chart.Data.Children.Add(ds); |
今回も、最後に Theme プロパティを設定して、グラフの外観を手早く設定します。
コードのコピー
|
|
---|---|
c1Chart.Theme = c1Chart.TryFindResource(new ComponentResourceKey(typeof(C1.WPF.C1Chart.C1Chart), "Office2007Black")) as ResourceDictionary; } |
このコードは、プログラムを実行して、ChartType プロパティを XYPlot、LineSymbols、または Area に変更し、別種のグラフを作成することによってテストできます。結果は、以下の図のようになるはずです。
この場合に最適なグラフタイプは、最初の XYPlot です。グラフは、ガジェットとウィジェットの収益の間にある正の相関を示しています。
これで、基本的なグラフ作成のトピックは終わりです。以上の方法で、一般的なグラフについてはすべてのタイプを作成できます。